package org.zjt.exception;

/**
 * Description:
 *
 * 如果finally中没有return语句，但是改变了要返回的值，这里有点类似与引用传递和值传递的区别，分以下两种情况，：
 *
 *      1）如果return的数据是基本数据类型或文本字符串，则在finally中对该基本数据的改变不起作用，try中的return语句依然会返回进入finally块之前保留的值。
 *
 *      2）如果return的数据是引用数据类型，而在finally中对该引用数据类型的属性值的改变起作用，try中的return语句返回的就是在finally中改变后的该属性的值。
 *
 *
 * @author juntao.zhang
 * Date: 2018-11-02 17:43
 * @see
 */
public class FinallyTest {


    /**
     * finally不能再return 修改值类型变量。
     * @return
     */
    public static int method1() {
        int num = 0;
        try {
            num = 1;
            return num;
        }finally {
            num = 2;
            System.out.println(num);
        }
    }


    /**
     * finally 可以在return前，修改引用类型变量。
     * @return
     */
    public static Student method2() {
        Student student = new Student();
        student.setName("zhangsan");
        student.setAge(24);
        try {
            student.setAge(12);
            return student;
        }finally {
            student.setAge(34);
            System.out.println(student);
        }
    }


    public static void main(String[] args) {
        System.out.println(method1());
        System.out.println(method2().age);
    }



    static class Student{
        private String name;
        private Integer age;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public Integer getAge() {
            return age;
        }

        public void setAge(Integer age) {
            this.age = age;
        }
    }
}
